using softDemo.Demain.Responsity;
using System;
using softDemo.Demain.User;
using Microsoft.EntityFrameworkCore;
using softDemo.basic.Db;
using System.Linq;
using softDemo.Demain;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace softDemo.basic.Responsity
{
    public class Responsity<T> : IResponsity<T> where T : BaseEntity
    {
        //数据上下文类
        private DbContext _db;

        //数据库上下文类中的实体
        private DbSet<T> _table { get; set; }

        //构造函数
        public Responsity(DbSoft db)    //通过构造函数依赖注入的方式，获取数据库上下文。
        {
            _db = db;
            _table = _db.Set<T>();      //_db.Set<T>()：找到_db数据库上下文类中，指定的T模型
        }

        //_db.Set<T>()
        //Microsoft.EntityFreamworkCore.Design

        //查找，获取单个实体
        public T GetById(Guid Id)
        {
            var entity = (from Tb in _table where Tb.ID == Id && Tb.IsDelete == false select Tb).FirstOrDefault();

            return entity;
        }

        public IQueryable<T> GetAble()
        {
            var Entitys = (from Tb in _table where Tb.IsDelete == false select Tb);
            return Entitys;
        }
        //添加
        public void Add(T entity)
        {
            _table.Add(entity);     //添加数据
            _db.SaveChanges();      //通过数据库上下文类，同步数据到数据库
        }

        //删除（这里的删除为伪删除，将IsDelete字段改为：ture）
        public bool Delete(Guid Id)
        {
            //通过Id,找到需要删除的实体数据
            var Entity = (from Tb in _table where Tb.ID == Id && Tb.IsDelete == false select Tb).FirstOrDefault();
            if (Entity != null)
            {
                //将找到的实体的IsDelete改为：true
                Entity.IsDelete = true;
                _table.Update(Entity);      //更新数据
                _db.SaveChanges();          //同步到数据库 
                return true;
            }
            else
            {
                return false;
            }
        }

        //修改、更新
        public void Update(T entity)
        {
            _table.Update(entity);  //更新
            _db.SaveChanges();      //同步数据库
        }

        public async Task<IEnumerable<T>> AddBulk(IEnumerable<T> entities)
        {
            foreach (var item in entities)
            {
                item.IsDelete = true;
                item.CreateAt = DateTime.Now;
                item.UpdateAt = DateTime.Now;
            }
            await _table.AddRangeAsync(entities);
            await _db.SaveChangesAsync();
            return entities;
        }
    }
}